import store from '@/store';
import { formatFlatteningRoutes, formatTwoStageRoutes } from './formatRoutes';
import { dynamicRoutes } from '@/router/routes';
import { RouteRecordRaw } from 'vue-router';

/**
 * 设置递归过滤有权限的路由到 vuex routesList 中（已处理成多级嵌套路由）及缓存多级嵌套数组处理后的一维数组
 * @description 用于左侧菜单、横向菜单的显示
 * @description 用于 tagsView、菜单搜索中：未过滤隐藏的(isHide)
 */
export function setFilterMenuAndCacheTagsViewRoutes() {
	store.dispatch('routesList/setRoutesList', setFilterHasAuthMenu(dynamicRoutes[0].children!, ['admin']));
	setCacheTagsViewRoutes();
}

/**
 * 获取当前用户权限标识去比对路由表，设置递归过滤有权限的路由
 * @param routes 当前路由 children
 * @param auths 用户权限标识，在 userInfos（用户信息）的 authPageList（登录页登录时缓存到浏览器）数组
 * @returns 返回有权限的路由数组 `meta.auth` 中控制
 */
export function setFilterHasAuthMenu(routes: Array<RouteRecordRaw>, auths: Array<string>) {
	const menu: Array<RouteRecordRaw> = [];
	routes.forEach((route) => {
		const item = { ...route };
		if (hasAuth(auths, item)) {
			if (item.children) item.children = setFilterHasAuthMenu(item.children, auths);
			menu.push(item);
		}
	});
	return menu;
}

/**
 * 判断路由 `meta.auth` 中是否包含当前登录用户权限字段
 * @param auths 用户权限标识，在 userInfos（用户信息）的 authPageList（登录页登录时缓存到浏览器）数组
 * @param route 当前循环时的路由项
 * @returns 返回对比后有权限的路由项
 */
export function hasAuth(auths: Array<string>, route: RouteRecordRaw) {
	const metaAuth = route.meta?.auth as Array<string> | undefined;
	if (metaAuth) return auths.some((auth) => metaAuth.includes(auth));
	else return true;
}

/**
 * 缓存多级嵌套数组处理后的一维数组
 * @description 用于 tagsView、菜单搜索中：未过滤隐藏的(isHide)
 */
export function setCacheTagsViewRoutes() {
	// 获取有权限的路由，否则 tagsView、菜单搜索中无权限的路由也将显示
	const authsRoutes = setFilterHasAuthMenu(dynamicRoutes, ['admin']);
	const filterAuthsRoutes = formatTwoStageRoutes(formatFlatteningRoutes(authsRoutes));
	if (!filterAuthsRoutes||!filterAuthsRoutes[0].children) return;
	// 添加到 vuex setTagsViewRoutes 中
	store.dispatch('tagsViewRoutes/setTagsViewRoutes', filterAuthsRoutes[0].children);
}
